package com.jiuma.view.longtouchbutton;

import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.Button;

@SuppressLint("ClickableViewAccessibility")
public class LongTouchBtn extends Button {

	/**
	 * 记录当前自定义Btn是否按下
	 */
	private boolean clickdown = false;

	/**
	 * 下拉刷新的回调接口
	 */
	private LongTouchListener mListener;

	/**
	 * 按钮长按时 间隔多少毫秒来处理 回调方法
	 */
	private int mtime;
	/** 按下时间 */
	private long startTime;
	/** 弹起时间 */
	private long endTime;

	/**
	 * 构造函数
	 * 
	 * @param context
	 * @param attrs
	 */
	public LongTouchBtn(Context context, AttributeSet attrs) {
		super(context, attrs);

	}

	/**
	 * 处理touch事件
	 */
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		if (event.getAction() == MotionEvent.ACTION_DOWN) {
			startTime = System.currentTimeMillis();
			clickdown = true;
			/** 长按判断逻辑 */
			new Thread(new LongTouchThread()).start();
			if (mListener!=null) {
				mListener.onStartTouch();
			}
			Log.i("huahua", "按下");
		} else if (event.getAction() == MotionEvent.ACTION_UP) {
			endTime = System.currentTimeMillis();
			long diff = endTime - startTime;// 这样得到的差值是微秒级别时间差
			if ((diff - mtime) > 0) {
				if (mListener != null) {
					mListener.onEndTouch();
				}
			}
			clickdown = false;
			Log.i("huahua", "弹起");
		}
		return super.onTouchEvent(event);
	}

	/**
	 * 使当前线程睡眠指定的毫秒数。
	 * 
	 * @param time
	 *            指定当前线程睡眠多久，以毫秒为单位
	 */
	private void sleep(int time) {
		try {
			Thread.sleep(time);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 处理长按的任务
	 */

	class LongTouchThread implements Runnable {

		@Override
		public void run() {
			int count = 0;
			/** 当手指未弹起且未达到限制时长 */
			while (clickdown && count * 1000 < mtime) {
				sleep(1000);
				count++;
			}
			/** 长按未结束 */
			if (clickdown) {
				new MyHandler(Looper.getMainLooper()).sendEmptyMessage(0x001);
			}
		}
	}

	class MyHandler extends Handler {
		public MyHandler(Looper looper) {
			super(looper);
		}

		public void handleMessage(Message msg) {
			mListener.onLongTouch();
		}
	};

	/**
	 * 给长按btn控件注册一个监听器。
	 * 
	 * @param listener
	 *            监听器的实现。
	 * @param time
	 *            多少毫秒时间间隔 来处理一次回调方法
	 */
	public void setOnLongTouchListener(LongTouchListener listener, int time) {
		mListener = listener;
		mtime = time;
	}

	/**
	 * 长按监听接口，使用按钮长按的地方应该注册此监听器来获取回调。
	 */
	public interface LongTouchListener {
		/**
		 * 开始
		 * */
		void onStartTouch();

		/**
		 * 处理长按的回调方法
		 */
		void onLongTouch();

		/**
		 * 长按结束
		 * */
		void onEndTouch();
	}
}